{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第07课：动手实战基于 ML 的中文短文本聚类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "整个过程分为以下几个步骤：\n",
    "\n",
    "* 语料加载\n",
    "* 分词\n",
    "* 去停用词\n",
    "* 抽取词向量特征\n",
    "* 实战 TF-IDF 的中文文本 K-means 聚类\n",
    "* 实战 word2Vec 的中文文本 K-means 聚类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import random\n",
    "import jieba\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.feature_extraction.text import TfidfTransformer\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.cluster import KMeans\n",
    "import gensim\n",
    "from gensim.models import Word2Vec\n",
    "from sklearn.preprocessing import scale\n",
    "import multiprocessing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#加载停用词\n",
    "stopwords=pd.read_csv('stopwords.txt',index_col=False,quoting=3,sep=\"\\t\",names=['stopword'], encoding='utf-8')\n",
    "stopwords=stopwords['stopword'].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#加载语料\n",
    "laogong_df = pd.read_csv('../data/07/beilaogongda.csv', encoding='utf-8', sep=',')\n",
    "laopo_df = pd.read_csv('../data/07/beilaogongda.csv', encoding='utf-8', sep=',')\n",
    "erzi_df = pd.read_csv('../data/07/beierzida.csv', encoding='utf-8', sep=',')\n",
    "nver_df = pd.read_csv('../data/07/beinverda.csv', encoding='utf-8', sep=',')\n",
    "#删除语料的nan行\n",
    "laogong_df.dropna(inplace=True)\n",
    "laopo_df.dropna(inplace=True)\n",
    "erzi_df.dropna(inplace=True)\n",
    "nver_df.dropna(inplace=True)\n",
    "#转换\n",
    "laogong = laogong_df.segment.values.tolist()\n",
    "laopo = laopo_df.segment.values.tolist()\n",
    "erzi = erzi_df.segment.values.tolist()\n",
    "nver = nver_df.segment.values.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#定义分词函数preprocess_text\n",
    "#参数content_lines即为上面转换的list\n",
    "#参数sentences是定义的空list，用来储存分词后的数据\n",
    "\n",
    "def preprocess_text(content_lines, sentences):\n",
    "    for line in content_lines:\n",
    "        try:\n",
    "            segs=jieba.lcut(line)\n",
    "            segs = [v for v in segs if not str(v).isdigit()]#去数字\n",
    "            segs = list(filter(lambda x:x.strip(), segs))   #去左右空格\n",
    "            segs = list(filter(lambda x:len(x)>1, segs)) #长度为1的字符\n",
    "            segs = list(filter(lambda x:x not in stopwords, segs)) #去掉停用词\n",
    "            sentences.append(\" \".join(segs))\n",
    "        except Exception:\n",
    "            print(line)\n",
    "            continue "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache /var/folders/yw/k7z_d_3567g16ss9plk47x9w0000gn/T/jieba.cache\n",
      "Loading model cost 0.694 seconds.\n",
      "Prefix dict has been built succesfully.\n"
     ]
    }
   ],
   "source": [
    "sentences = []\n",
    "preprocess_text(laogong, sentences)\n",
    "preprocess_text(laopo, sentences)\n",
    "preprocess_text(erzi, sentences)\n",
    "preprocess_text(nver, sentences)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 将得到的数据集打散，生成更可靠的训练集分布，避免同类数据分布不均匀\n",
    "random.shuffle(sentences)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "报警 人称 儿子 人伤 无需 救护 民警 到场\n",
      "家暴 老公 持械 人伤 无需 救护 民警 到场\n",
      "报警 人称 疑似 丈夫 民警 到场\n",
      "报警 老公 凳子 人伤 无需 民警 到场 民警 携带 防护 装备\n",
      "家暴 老公 持械 民警 到场\n",
      "报警 人称 老公 民警 到场\n",
      "报警 人称 老公 持械 民警 到场\n",
      "报警 女儿 人伤 无需 救护 民警 到场 民警\n",
      "报警 女儿 人伤 牙齿 出血 民警 到场\n",
      "报警 老公 老公 醉酒 人未伤\n"
     ]
    }
   ],
   "source": [
    "for sentence in sentences[:10]:\n",
    "    print(sentence)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "抽取特征，将文本中的词语转换为词频矩阵，统计每个词语的 tf-idf 权值，获得词在对应文本中的 tf-idf 权重："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Features length: 387\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/zhangjianfeng/anaconda3/lib/python3.6/site-packages/sklearn/feature_extraction/text.py:1089: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  if hasattr(X, 'dtype') and np.issubdtype(X.dtype, np.float):\n"
     ]
    }
   ],
   "source": [
    "#将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i类文本下的词频\n",
    "vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5)\n",
    "#统计每个词语的tf-idf权值\n",
    "transformer = TfidfTransformer()\n",
    "# 第一个fit_transform是计算tf-idf 第二个fit_transform是将文本转为词频矩阵\n",
    "tfidf = transformer.fit_transform(vectorizer.fit_transform(sentences))\n",
    "# 获取词袋模型中的所有词语\n",
    "word = vectorizer.get_feature_names()\n",
    "# 将tf-idf矩阵抽取出来，元素w[i][j]表示j词在i类文本中的tf-idf权重\n",
    "weight = tfidf.toarray()\n",
    "#查看特征大小\n",
    "print ('Features length: ' + str(len(word)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<1722x387 sparse matrix of type '<class 'numpy.float64'>'\n",
       "\twith 6870 stored elements in Compressed Sparse Row format>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tfidf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       ...,\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.]])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "weight"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['52',\n",
       " 'q5',\n",
       " '一人',\n",
       " '一人伤',\n",
       " '一会儿',\n",
       " '一名',\n",
       " '一楼',\n",
       " '一辆',\n",
       " '丈夫',\n",
       " '上址',\n",
       " '不上',\n",
       " '不倒翁',\n",
       " '不明',\n",
       " '不清',\n",
       " '不用',\n",
       " '不肯',\n",
       " '不行',\n",
       " '不见',\n",
       " '不让',\n",
       " '不详',\n",
       " '不通',\n",
       " '不需',\n",
       " '东西',\n",
       " '中断',\n",
       " '中有',\n",
       " '中称',\n",
       " '丰路',\n",
       " '争吵',\n",
       " '事情',\n",
       " '亚美尼亚人',\n",
       " '亲戚',\n",
       " '人代报',\n",
       " '人伤',\n",
       " '人借',\n",
       " '人手',\n",
       " '人无事',\n",
       " '人无伤',\n",
       " '人未伤',\n",
       " '人称',\n",
       " '人系',\n",
       " '人脚',\n",
       " '代报',\n",
       " '伤及',\n",
       " '住户',\n",
       " '保安',\n",
       " '做好',\n",
       " '催问',\n",
       " '儿子',\n",
       " '儿称',\n",
       " '充电器',\n",
       " '公交车站',\n",
       " '公分',\n",
       " '关在',\n",
       " '关机',\n",
       " '其称',\n",
       " '其近',\n",
       " '具体地址',\n",
       " '冲突',\n",
       " '凳子',\n",
       " '出血',\n",
       " '出轨',\n",
       " '分处',\n",
       " '分局',\n",
       " '分已',\n",
       " '分钟',\n",
       " '刚刚',\n",
       " '前妻',\n",
       " '剪刀',\n",
       " '割伤',\n",
       " '区划',\n",
       " '医治',\n",
       " '医院',\n",
       " '十一',\n",
       " '卧室',\n",
       " '卫生局',\n",
       " '去过',\n",
       " '又称',\n",
       " '反打',\n",
       " '反锁',\n",
       " '发生',\n",
       " '受伤',\n",
       " '变更',\n",
       " '口角',\n",
       " '后往',\n",
       " '告知',\n",
       " '咬伤',\n",
       " '咱不需',\n",
       " '喉咙',\n",
       " '喊救命',\n",
       " '嘴唇',\n",
       " '回到',\n",
       " '回去',\n",
       " '回家',\n",
       " '在场',\n",
       " '在家',\n",
       " '地上',\n",
       " '地址',\n",
       " '坐在',\n",
       " '处置',\n",
       " '处警',\n",
       " '外伤',\n",
       " '外国人',\n",
       " '外面',\n",
       " '多岁',\n",
       " '大碍',\n",
       " '夫妇',\n",
       " '夫妻',\n",
       " '头上',\n",
       " '头晕',\n",
       " '头痛',\n",
       " '头部',\n",
       " '奥迪',\n",
       " '女儿',\n",
       " '妇女',\n",
       " '妈妈',\n",
       " '妹妹',\n",
       " '妻子',\n",
       " '威胁',\n",
       " '婚外情',\n",
       " '婴儿',\n",
       " '媳妇',\n",
       " '子要',\n",
       " '孕妇',\n",
       " '孙女',\n",
       " '孤老',\n",
       " '孩子',\n",
       " '定位',\n",
       " '家中',\n",
       " '家庭',\n",
       " '家庭暴力',\n",
       " '家暴',\n",
       " '家门',\n",
       " '对象',\n",
       " '将门',\n",
       " '小区',\n",
       " '小姑',\n",
       " '小孩',\n",
       " '尾号',\n",
       " '居委',\n",
       " '居委会',\n",
       " '居民',\n",
       " '工作',\n",
       " '工作人员',\n",
       " '工具',\n",
       " '工号',\n",
       " '已处',\n",
       " '并称',\n",
       " '座机',\n",
       " '开门',\n",
       " '异地',\n",
       " '引发',\n",
       " '当事人',\n",
       " '徒手',\n",
       " '得知',\n",
       " '必备',\n",
       " '怀孕',\n",
       " '急救车',\n",
       " '情况',\n",
       " '情况不明',\n",
       " '情绪',\n",
       " '情节',\n",
       " '房子',\n",
       " '手上',\n",
       " '手伤',\n",
       " '手持',\n",
       " '手指',\n",
       " '手推',\n",
       " '手机',\n",
       " '手机号',\n",
       " '手痛',\n",
       " '手部',\n",
       " '打人',\n",
       " '打伤',\n",
       " '打倒',\n",
       " '打其',\n",
       " '打打',\n",
       " '打架',\n",
       " '打死',\n",
       " '打电话',\n",
       " '打耳光',\n",
       " '扫帚',\n",
       " '扬言',\n",
       " '抓伤',\n",
       " '抢过来',\n",
       " '担子',\n",
       " '担心',\n",
       " '拖鞋',\n",
       " '拳头',\n",
       " '拿到',\n",
       " '拿尺',\n",
       " '拿称',\n",
       " '拿长',\n",
       " '拿鞋',\n",
       " '持刀',\n",
       " '持械',\n",
       " '持续',\n",
       " '持饭',\n",
       " '接到',\n",
       " '接听',\n",
       " '接电话',\n",
       " '措施',\n",
       " '携带',\n",
       " '摔碗',\n",
       " '放下',\n",
       " '救命',\n",
       " '救护',\n",
       " '救护车',\n",
       " '断了腿',\n",
       " '无人',\n",
       " '无需',\n",
       " '早上',\n",
       " '昨天',\n",
       " '暂时',\n",
       " '有人',\n",
       " '有伤',\n",
       " '有刀',\n",
       " '木制',\n",
       " '木棍',\n",
       " '杀人',\n",
       " '杆子',\n",
       " '来电',\n",
       " '来过',\n",
       " '松江',\n",
       " '板凳',\n",
       " '梅陇',\n",
       " '梯子',\n",
       " '棍子',\n",
       " '棒头',\n",
       " '棒子',\n",
       " '椅子',\n",
       " '楼上',\n",
       " '榔头',\n",
       " '此警',\n",
       " '武器',\n",
       " '武器装备',\n",
       " '残疾人',\n",
       " '母亲',\n",
       " '母子',\n",
       " '求助',\n",
       " '没事',\n",
       " '沪牌',\n",
       " '注意安全',\n",
       " '活动室',\n",
       " '派出所',\n",
       " '流血',\n",
       " '浑身',\n",
       " '激动',\n",
       " '烟缸',\n",
       " '烧纸',\n",
       " '爬不起来',\n",
       " '父亲',\n",
       " '父女',\n",
       " '父子',\n",
       " '牙齿',\n",
       " '物业公司',\n",
       " '物品',\n",
       " '玩具',\n",
       " '现人',\n",
       " '现其',\n",
       " '现场',\n",
       " '现已',\n",
       " '现称',\n",
       " '现跑',\n",
       " '玻璃',\n",
       " '瓶子',\n",
       " '用碗',\n",
       " '用脚',\n",
       " '用针',\n",
       " '电告',\n",
       " '电线',\n",
       " '电视机',\n",
       " '电话',\n",
       " '疑似',\n",
       " '疾病',\n",
       " '病人',\n",
       " '皮带',\n",
       " '盒子',\n",
       " '相关',\n",
       " '看不见',\n",
       " '眼睛',\n",
       " '矛盾',\n",
       " '石英',\n",
       " '砍刀',\n",
       " '砸坏',\n",
       " '确认',\n",
       " '离去',\n",
       " '离婚',\n",
       " '离开',\n",
       " '称其',\n",
       " '称现',\n",
       " '称要',\n",
       " '稍后',\n",
       " '窗口',\n",
       " '第三者',\n",
       " '等候',\n",
       " '等同',\n",
       " '筷子',\n",
       " '精神',\n",
       " '精神病',\n",
       " '纠纷',\n",
       " '经济纠纷',\n",
       " '翟路',\n",
       " '翟路纪',\n",
       " '老人',\n",
       " '老伴',\n",
       " '老公',\n",
       " '老北',\n",
       " '老大爷',\n",
       " '老太',\n",
       " '老太太',\n",
       " '老头',\n",
       " '老奶奶',\n",
       " '老婆',\n",
       " '老年',\n",
       " '老年痴呆',\n",
       " '联系电话',\n",
       " '肋骨',\n",
       " '肯德基',\n",
       " '脖子',\n",
       " '脚踢',\n",
       " '脸盆',\n",
       " '脸部',\n",
       " '自动',\n",
       " '自残',\n",
       " '自称',\n",
       " '自行',\n",
       " '致电',\n",
       " '菜刀',\n",
       " '虐待',\n",
       " '虬泾路',\n",
       " '衣服',\n",
       " '衣架',\n",
       " '补充',\n",
       " '装备',\n",
       " '装机',\n",
       " '解决',\n",
       " '解释',\n",
       " '警卫室',\n",
       " '警号',\n",
       " '警察',\n",
       " '设备',\n",
       " '询问',\n",
       " '该户',\n",
       " '赌博',\n",
       " '走后',\n",
       " '赶出来',\n",
       " '起不来',\n",
       " '起因',\n",
       " '路人报',\n",
       " '路边',\n",
       " '路近',\n",
       " '踢门',\n",
       " '身上',\n",
       " '轻伤',\n",
       " '轻微伤',\n",
       " '辛耕路',\n",
       " '过场',\n",
       " '还称',\n",
       " '追其',\n",
       " '送来',\n",
       " '逃出来',\n",
       " '逃逸',\n",
       " '通知',\n",
       " '通话',\n",
       " '邻居',\n",
       " '酒瓶',\n",
       " '醉酒',\n",
       " '钥桥',\n",
       " '铁棍',\n",
       " '银行卡',\n",
       " '锁事',\n",
       " '门卫',\n",
       " '门卫室',\n",
       " '门口',\n",
       " '门外',\n",
       " '闵行',\n",
       " '防护',\n",
       " '阿姨',\n",
       " '隔壁',\n",
       " '鞋子',\n",
       " '项链',\n",
       " '验伤',\n",
       " '骨折',\n",
       " '黑色',\n",
       " '鼻子',\n",
       " '龙州',\n",
       " '龙舟']"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "word"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "numClass=4 #聚类分几簇\n",
    "clf = KMeans(n_clusters=numClass, max_iter=10000, init=\"k-means++\", tol=1e-6)  #这里也可以选择随机初始化init=\"random\"\n",
    "pca = PCA(n_components=10)  # 降维\n",
    "TnewData = pca.fit_transform(weight)  # 载入N维\n",
    "s = clf.fit(TnewData)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_cluster(result,newData,numClass):\n",
    "    plt.figure(2)\n",
    "    Lab = [[] for i in range(numClass)]\n",
    "    index = 0\n",
    "    for labi in result:\n",
    "        Lab[labi].append(index)\n",
    "        index += 1\n",
    "    color = ['oy', 'ob', 'og', 'cs', 'ms', 'bs', 'ks', 'ys', 'yv', 'mv', 'bv', 'kv', 'gv', 'y^', 'm^', 'b^', 'k^',\n",
    "             'g^'] * 3 \n",
    "    for i in range(numClass):\n",
    "        x1 = []\n",
    "        y1 = []\n",
    "        for ind1 in newData[Lab[i]]:\n",
    "            # print ind1\n",
    "            try:\n",
    "                y1.append(ind1[1])\n",
    "                x1.append(ind1[0])\n",
    "            except:\n",
    "                pass\n",
    "        plt.plot(x1, y1, color[i])\n",
    "\n",
    "    #绘制初始中心点\n",
    "    x1 = []\n",
    "    y1 = []\n",
    "    for ind1 in clf.cluster_centers_:\n",
    "        try:\n",
    "            y1.append(ind1[1])\n",
    "            x1.append(ind1[0])\n",
    "        except:\n",
    "            pass\n",
    "    plt.plot(x1, y1, \"rv\") #绘制中心\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD8CAYAAACfF6SlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XuQXOV55/HvMz0XDwZ7hCSPGIQk\nU0gyo2wVWk+hkknCpCSnCFsL+cNr44gY8GWCZGedSja1bBFwLBe1xKls4ipLJBNfII68vqRq14pN\n4gTFA1taoTCsFaeksYSiICOPGEBBchyELjPP/nG6Z7p7zuk+3X36en6fqqnpc/p0n/fM5Tlvv5fn\nNXdHRETSpavZBRARkcZT8BcRSSEFfxGRFFLwFxFJIQV/EZEUUvAXEUkhBX8RkRRS8BcRSSEFfxGR\nFOpudgGiLFu2zNesWdPsYoiItJXnn3/+NXdfXu64lg3+a9asYXJystnFEBFpK2Z2Ms5xavYREUkh\nBX8RkRRS8BcRSaFEgr+Z3WZmR83suJk9EPL8KjP7npl938x+YGa3J3FeERGpTs3B38wywC7gl4Bh\n4INmNlx02O8A33D3jcBdwO5azysiItVLYrTPzcBxdz8BYGZfA+4EjuQd48Dbso/fDkwncN62ZhMT\nkc/56GjDyiEi6ZRE8L8WeClv+xSwqeiY3wX+xsx+HXgrsDWB84qISJWSaPO3kH3Fa0N+EHjc3VcC\ntwNfMbNF5zazMTObNLPJV199NYGiiYhImCSC/yngurztlSxu1vkI8A0Adz8AvAVYVvxG7j7u7iPu\nPrJ8edkJaiIiUqUkgv9zwFoze6eZ9RJ06O4tOuZHwBYAM7uRIPirai8i0iQ1B393vwx8AvguMEUw\nquewme00szuyh/0W8DEz+wfgfwL3untx05CIiDRIIrl93P1J4MmifQ/nPT4C3JLEuUREpHYtm9it\n02k4p4g0k9I7iIikkIK/iEgKKfiLiKSQgr+ISAop+IuIpJCCv4hICin4i4ikkIK/iEgKKfiLiKSQ\ngr+ISAop+IuIpJCCv4hICin4i4ikkIK/iEgKKfiLiKSQgr+ISAop+IuIpJCCv4hICin4i4ikkIK/\niEgKKfiLiKRQIsHfzG4zs6NmdtzMHog45v1mdsTMDpvZV5M4r4iIVKfm4G9mGWAX8EvAMPBBMxsu\n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\ngRIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pca = PCA(n_components=2)  # 输出两维\n",
    "newData = pca.fit_transform(weight)  # 载入N维\n",
    "result = list(clf.predict(TnewData))\n",
    "plot_cluster(result,newData,numClass)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "from sklearn.manifold import TSNE\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nlEqkWgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.manifold import TSNE\n",
    "ts =TSNE(2)\n",
    "newData = ts.fit_transform(weight)\n",
    "result = list(clf.predict(TnewData))\n",
    "plot_cluster(result,newData,numClass)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了更好的表达和获取更具有代表性的信息，在展示（可视化）高维数据时，更为一般的处理，常常先用 PCA 进行降维，再使用 TSNE："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.manifold import TSNE\n",
    "newData = PCA(n_components=4).fit_transform(weight)  # 载入N维\n",
    "newData =TSNE(2).fit_transform(newData)\n",
    "result = list(clf.predict(TnewData))\n",
    "plot_cluster(result,newData,numClass)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "总结：\n",
    "1、特征向量的构建，除了词袋模型，可以考虑使用 word2vec 和 doc2vec 等；\n",
    "2、模型上可以采用基于密度的 DBSCAN、层次聚类等算法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
